<html>
<head>
    <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Java8 Stream流学习笔记 | |ω･`)暗中观察</title>
<meta name="description" content="大爷不进来看看吗？这里有好康的哦~~~" />
<link rel="shortcut icon" href="https://Yanoona.github.io/favicon.ico">
<link rel="stylesheet" href="https://Yanoona.github.io/styles/main.css">

<script src="https://Yanoona.github.io/media/js/jquery.min.js"></script>
<script src="https://Yanoona.github.io/media/js/masonry.pkgd.min.js"></script>
<script src="https://Yanoona.github.io/media/js/aos.js"></script>
<script src="https://Yanoona.github.io/media/js/pace.min.js"></script>
<script src="https://Yanoona.github.io/media/js/view-image.min.js"></script>
<script src="https://Yanoona.github.io/media/js/functions.js"></script>
    <script src="https://Yanoona.github.io/media/js/waterfall.min.js"></script>
    <script src="https://Yanoona.github.io/media/js/prism.min.js"></script>
</head>
<body>
<header id="header" class="grid-container">
    <!-- start: .menu-wrapper -->
    <div class="menu-mobile">
        <i class="fa fa-reorder"></i>
    </div>
    <div class="menu-wrapper">
        <div class="">
            <nav class="main-nav " >
                <ul id="menu-header" class="menu gradient-effect">
                    
                        <li class="">
                            <a href="https://Yanoona.github.io" class="menu">
                                首页
                            </a>
                        </li>
                    
                        <li class="">
                            <a href="https://Yanoona.github.io/archives" class="menu">
                                归档
                            </a>
                        </li>
                    
                        <li class="">
                            <a href="https://Yanoona.github.io/tags" class="menu">
                                标签
                            </a>
                        </li>
                    
                        <li class="">
                            <a href="https://github.com/Yanoona" class="menu">
                                关于
                            </a>
                        </li>
                    
                </ul>
            </nav>
            <!-- end: .main-nav -->
            <div class="clear"></div>
            <div class="border hide-on-tablet hide-on-mobile"></div>
        </div>
        <div class="clear"></div>
    </div>
    <!-- end: .menu-wrapper -->
    <div class="clear"></div>
</header>

<main id="single" class="main grid-container fullcover no-sidebar aos-init aos-animate" data-aos="fade">

    <div class="center content">
        <div class="featured-image cover"
             style="background-image: url('https://Yanoona.github.io/post-images/2rO0MFRF0.jpg');">
            <div class="meta top">
                <time class="meta-info" style="float:left;" datetime="2020-06-29"><i
                            class="fa fa-calendar"></i><span
                            class="lately">40 分钟前</span></time>
            </div>
            <div class="info">
                <div class="tags ">
                    
                        <a href="https://Yanoona.github.io/java/" class="ctag ctag-0 ctag-java"
                           aria-label="">Java</a>
                    
                </div>
                <h1 class="title ularge white bold">Java8 Stream流学习笔记</h1>
            </div>
        </div>
    </div>

    <div class="epcl-page-wrapper">
        <div class="left-content grid-70 np-mobile">
            <article class="main-article post">
                <section class="post-content">
                    <div class="text">
                        <h2 id="流简介">流简介</h2>
<h3 id="1流是什么">1.流是什么？</h3>
<blockquote>
<p>流到底是什么呢🍧？简短的定义就是“ 从支持<strong>数据处理操作</strong>的<strong>源</strong>生成的<strong>元素序列</strong> ”</p>
</blockquote>
<!-- more -->
<ul>
<li>元素序列：就像集合一样，流也提供了一个接口，可以访问特定元素类型的一组有序值。但流的目的在于表达计算，比如filter、sorted和map。集合讲的事数据，流讲的是计算。</li>
<li>源：流会使用一个提供数据的源，如集合、数组或者输入/输出资源。</li>
<li>数据处理操作：流的数据处理功能支持类似于数据库的操作，以及函数式编程语言中的常用操作，如filter、map、reduce、find、match、sort等。流操作可以顺序执行，也可以并行执行。</li>
</ul>
<p>流操作两个重要的特点：</p>
<ol>
<li>流水线：很多流操作本身会返回一个流，这样多个操作就可以链接起来，形成一个大的流水线。</li>
<li>内部迭代：与使用迭代器显示迭代的集合不同，流的迭代操作是在背后进行的。</li>
</ol>
<h3 id="2流与集合">2.流与集合</h3>
<blockquote>
<p>流与集合之间的差异在于<strong>什么时候进行计算</strong>。</p>
</blockquote>
<p>集合是一个内存中的数据结构，它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。（集合中的每个元素都是放在内存里的，元素都得先算出来才能成为集合的一部分。）</p>
<p>流是在概念上固定的数据结构（你不能添加或删除元素），其元素则是<strong>按需计算的</strong>。（流就像是一个延迟创建的集合：只有在消费者要求的时候才会计算值。）</p>
<h4 id="21-流只能遍历一次">2.1 流只能遍历一次</h4>
<p><mark>和迭代器类似，流只能遍历一次。遍历完之后，我们就说这个流已经被消费掉了。</mark></p>
<p>就比如下面这段代码：</p>
<pre><code class="language-java">List&lt;String&gt; title = Arrays.asList(&quot;Java8&quot;,&quot;In&quot;,&quot;Action&quot;);
Stream&lt;String&gt; s = title.stream();
s.forEach(System.out::println);
//到这里就会报出异常：流已被操作或者关闭
s.forEach(System.out::println);
</code></pre>
<h3 id="3-外部迭代与内部迭代">3. 外部迭代与内部迭代</h3>
<blockquote>
<p>使用Collection接口需要用户去做迭代（比如用for-each），这称为外部迭代。相反，Streams库使用<strong>内部迭代</strong>——它帮你把迭代做了，还把得到的流值存在了某个地方，你只要给出一个函数说要干什么就可以了。</p>
</blockquote>
<h4 id="31-使用内部迭代的原因">3.1 使用内部迭代的原因</h4>
<p>内部迭代时，项目可以透明的并行处理，或者用更优化的顺序进行处理。</p>
<p>Streams库的内部迭代可以自动选择一种适合硬件的数据表示和并行实现。与此相反，一旦通过写for-each而选择了外部迭代，那你基本上就要自己管理所有的并行问题了（<em>自己管理</em>实际上意味着“某个良辰吉日我们会把它并行化”或者“开始了关于人物和synchronized的漫长二而艰苦的斗争”。）</p>
<figure data-type="image" tabindex="1"><img src="https://Yanoona.github.io/post-images/1593411345757.png" alt="" loading="lazy"></figure>
<h3 id="4-流操作">4. 流操作</h3>
<blockquote>
<p>可以连接起来的流操作称为<strong>中间操作</strong>，关闭流的操作称为<strong>终端操作</strong>。</p>
</blockquote>
<h4 id="41-中间操作">4.1 中间操作</h4>
<p>诸如filter或sorted等中间操作会返回另一个流。折让多个操作可以链接起来形成一个查询。重要的是，<mark>除非流水线上出发一个终端操作，否则中间操作不会执行任何处理——它们很懒。</mark></p>
<h4 id="42-终端操作">4.2 终端操作</h4>
<p>终端操作会从流的流水线生成结果。其结果是任何不是流的值，比如List、Integer，甚至是void。</p>
<h4 id="43-使用流">4.3 使用流</h4>
<blockquote>
<p>总而言之，流的使用一般包括三件事：</p>
<ol>
<li>一个数据源（如集合）来执行一个查询；</li>
<li>一个中间操作链，形成一条流的流水线；</li>
<li>一个终端操作，执行流水线，并能生成结果；</li>
</ol>
</blockquote>
<p>中间操作：</p>
<table>
<thead>
<tr>
<th style="text-align:center">操作</th>
<th style="text-align:center">类型</th>
<th style="text-align:center">返回类型</th>
<th style="text-align:center">操作参数</th>
<th style="text-align:center">函数描述符</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">filter</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center">Predicate<T></td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">map</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<R></td>
<td style="text-align:center">Funcation&lt;T，R&gt;</td>
<td style="text-align:center">T -&gt; R</td>
</tr>
<tr>
<td style="text-align:center">limit</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">sorted</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center">Comparator<T></td>
<td style="text-align:center">(T，T) -&gt; int</td>
</tr>
<tr>
<td style="text-align:center">distinct</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
</tbody>
</table>
<p>终端操作：</p>
<table>
<thead>
<tr>
<th style="text-align:center">操作</th>
<th style="text-align:center">类型</th>
<th style="text-align:center">目的</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">forEach</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">消费流中的每个元素并对其应用Lambda。这一操作返回void</td>
</tr>
<tr>
<td style="text-align:center">count</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">返回流中元素的个数。这一操作返回long</td>
</tr>
<tr>
<td style="text-align:center">collect</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">把流归约成一个集合，比如List、Map甚至是Integer。</td>
</tr>
</tbody>
</table>
<h3 id="小结">小结</h3>
<ol>
<li>流是“ 从支持数据处理操作的源生成的一系列元素 ”。</li>
<li>流利用内部迭代：迭代通过filter、map、sorted等操作被抽象掉了。</li>
<li>流操作有两类：中间操作和终端操作（也就终止操作）。</li>
<li>filter和map等中间操作会返回一个流，并可以链接在一起。可以把它们设置成一条流水线，但并不会生成任何结果。</li>
<li>forEach和count等终端操作会返回一个非流的值，并处理流水线以返回结果。</li>
<li>流中的元素是按需计算的。</li>
</ol>
<hr>
<h2 id="使用流">使用流</h2>
<h3 id="1-筛选和切片">1. 筛选和切片</h3>
<h4 id="11-谓词筛选">1.1 谓词筛选</h4>
<blockquote>
<p>Stream接口支持filter方法。该操作会接收一个谓词（一个返回boolean的函数）作为参数，并返回一个包括所有符合谓词的元素的流</p>
</blockquote>
<p>代码示例：</p>
<pre><code class="language-java">List&lt;Dish&gt; vegetarianMenu = menu.stream().filter(Dish::isVegetarian).collect(toList());
</code></pre>
<h4 id="12-筛选各异元素去重">1.2 筛选各异元素（去重）</h4>
<p><mark>使用<code>distinct()</code>方法。</mark></p>
<h4 id="13-截短流">1.3 截短流</h4>
<blockquote>
<p>流支持==<strong>limit(n)</strong>==方法，该方法会返回一个不超过给定长度的流。所需的长度做为参数传递给limit。如果流是有序的，则最多会返回前n个元素。</p>
</blockquote>
<h4 id="14-跳过元素">1.4 跳过元素</h4>
<blockquote>
<p>流支持==<strong>skip(n)</strong>==方法，该方法会返回一个扔4</p>
<p>掉前n个元素的流。如果流中元素不足n个，则返回一个空值。</p>
</blockquote>
<h3 id="2-映射">2. 映射</h3>
<p>map</p>
<blockquote>
<p>流支持<strong>map</strong>方法，它会接收一个函数做为参数。这个函数会被应用到每个元素上，并将其映射成一个新的元素 （使用映射一次，是因为它和转换类似，但其中的细微差别在于它是**“创建一个新版本”而不是去“修改”**）。</p>
</blockquote>
<p>flatMap</p>
<blockquote>
<p>流支持flatMap方法，它的效果是，把一个流中的每个值都换成另一个流，然后把所有的流连接起来成为一个流。</p>
</blockquote>
<h3 id="3查找和匹配">3.查找和匹配</h3>
<h4 id="31-检查谓词是否至少匹配一个元素">3.1 检查谓词是否至少匹配一个元素</h4>
<p>使用==<strong>anyMatch</strong>==方法。anyMatch方法返回一个boolean，因此是一个终端操作。</p>
<h4 id="32-检查谓词是否匹配所有元素">3.2 检查谓词是否匹配所有元素</h4>
<p>使用==<strong>allMatch</strong>==方法。它的工作原理和anyMatch类似，但它会看看流中的元素是否<strong>都能</strong>匹配给定的谓词。</p>
<p>其中和allMatch相对的是==<strong>noneMatch</strong>==。它可以确保流中没有任何元素与给定的谓词匹配。</p>
<p><mark>注意：anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的<strong>短路</strong>，这就是大家熟悉的Java中&amp;&amp;和||运算符短路在流中的版本。</mark></p>
<blockquote>
<p><strong>短路求值：</strong></p>
<p>​         对于流而言，某些操作（例如allMatch、anyMatch、noneMatch、findFirst和findAny）不用处理整个流就能得到结果。只要找到一个元素，就可以有结果了。同样，limit也是一个短路操作：它只需要创建一个给定大小的流，而用不着处理流中所有的元素。在碰到无限大小的流的时候，这种操作就有用了：它们可以把<strong>无限流</strong>变成<strong>有限流</strong>。</p>
</blockquote>
<h4 id="33-查找元素">3.3 查找元素</h4>
<p>==<strong>findAny</strong>==方法将返回当前流中的任意元素。</p>
<p>其中这里涉及到<strong>Optional</strong>函数，以下为Optional简介：</p>
<blockquote>
<p>Optional<T>类（java.util.Optional）是一个容器类，代表一个值存在或不存在。findAny有时候可能什么元素都没找到。Java8的库设计人员引入了Optional<T>，这样就不用返回众所周知容易出问题的null了。</p>
</blockquote>
<p>Optional常用检查方法说明：</p>
<ul>
<li>isPresent（）将在Optional包含值的时候返回true，否则返回false。</li>
<li>ifPresent（Consumer<T> block）会在值存在的时候执行给定的代码块。</li>
<li>T get（）会在只存在时返回值，否则抛出一个NoSuchElement异常。</li>
<li>T orElse（T other）会在值存在时返回值，否则返回一个默认值。</li>
</ul>
<hr>
<h3 id="4-到目前为止所学习的中间操作和终端操作记录">4. 到目前为止所学习的中间操作和终端操作记录</h3>
<table>
<thead>
<tr>
<th style="text-align:center">操作</th>
<th style="text-align:center">类型</th>
<th style="text-align:center">返回类型</th>
<th style="text-align:center">操作参数</th>
<th style="text-align:center">函数描述符</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">filter</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center">Predicate<T></td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">map</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<R></td>
<td style="text-align:center">Funcation&lt;T，R&gt;</td>
<td style="text-align:center">T -&gt; R</td>
</tr>
<tr>
<td style="text-align:center">limit</td>
<td style="text-align:center">中间（有状态-有界）</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">sorted</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center">Comparator<T></td>
<td style="text-align:center">(T，T) -&gt; int</td>
</tr>
<tr>
<td style="text-align:center">distinct</td>
<td style="text-align:center">中间（有状态-无界）</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">skip</td>
<td style="text-align:center">中间（有状态-有界）</td>
<td style="text-align:center">Stream<T></td>
<td style="text-align:center">long</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">flatMap</td>
<td style="text-align:center">中间</td>
<td style="text-align:center">Stream<R></td>
<td style="text-align:center">Funcation&lt;T,Stream<R>&gt;</td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">anyMatch</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">Predicate<T></td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">noneMatch</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">Predicate<T></td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">allMatch</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">Predicate<T></td>
<td style="text-align:center">T -&gt; boolean</td>
</tr>
<tr>
<td style="text-align:center">findAny</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">Optional<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">findFirst</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">Optional<T></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">forEach</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">void</td>
<td style="text-align:center">Consumer<T></td>
<td style="text-align:center">T -&gt; void</td>
</tr>
<tr>
<td style="text-align:center">collect</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">R</td>
<td style="text-align:center">Collector&lt;T，A，R&gt;</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">reduce</td>
<td style="text-align:center">终端（有状态-有界）</td>
<td style="text-align:center">Optional<T></td>
<td style="text-align:center">BinaryOperator</td>
<td style="text-align:center">（T，T） -&gt; T</td>
</tr>
<tr>
<td style="text-align:center">count</td>
<td style="text-align:center">终端</td>
<td style="text-align:center">long</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
</tbody>
</table>
<p>更新时间：2020/6/29</p>
<!-- more -->

                    </div>
                    <div class="clear"></div>
                </section>
            </article>
            <div class="clear"></div>

            <section class="related section">
                
                
                    <article class="next grid-50 tablet-grid-50 grid-parent">
                        <div class="thumb cover lazy loaded"
                             style="background-image: url('https://Yanoona.github.io/post-images/ta0wVkBzF.jpg');"></div>
                        <a href="https://Yanoona.github.io/ta0wVkBzF/" class="full-link"></a>
                        <div class="info">
                            <time datetime="2020-05-13">2020-05-13</time>
                            <h4 class="title white no-margin">Spring 知识回顾之 体系结构</h4>
                        </div>
                        <span class="epcl-button red">
                  <img src="https://Yanoona.github.io/media/images/right-arrow.svg" width="15" alt="Left Arrow">
                </span>
                        <div class="overlay"></div>
                    </article>
                

                <div class="clear"></div>
            </section>
        </div>
    </div>
</main>

    <footer id="footer" class="grid-container">
        <div class="widgets row gradient-effect">
            <div class="default-sidebar border-effect">
              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="tag_cloud-2" class="widget widget_epcl_posts_thumbs underline-effect">
                  <h4 class="widget-title title white bordered">最新文章</h4>
                  
                  
                  <article class="item post-0 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://Yanoona.github.io/2rO0MFRF0/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display: block;background-image: url('https://Yanoona.github.io/post-images/2rO0MFRF0.jpg');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2020-06-29">2020-06-29</time>
                      <h4 class="title usmall">
                        <a href="https://Yanoona.github.io/2rO0MFRF0/">Java8 Stream流学习笔记</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  <article class="item post-1 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://Yanoona.github.io/ta0wVkBzF/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display: block;background-image: url('https://Yanoona.github.io/post-images/ta0wVkBzF.jpg');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2020-05-13">2020-05-13</time>
                      <h4 class="title usmall">
                        <a href="https://Yanoona.github.io/ta0wVkBzF/">Spring 知识回顾之 体系结构</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  <article class="item post-2 post type-post status-publish format-standard has-post-thumbnail hentry">
                    <a href="https://Yanoona.github.io/CpjS5YWXn/" class="thumb hover-effect">
                      <span class="fullimage cover" style="display: block;background-image: url('https://Yanoona.github.io/post-images/CpjS5YWXn.jpg');"></span>
                    </a>
                    <div class="info gradient-effect">
                      <time datetime="2020-05-13">2020-05-13</time>
                      <h4 class="title usmall">
                        <a href="https://Yanoona.github.io/CpjS5YWXn/">Spring 知识回顾之 概念</a>
                      </h4>
                    </div>
                    <div class="clear"></div>
                  </article>
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  <div class="clear"></div>
                </section>
              </div>

              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="tag_cloud-2" class="widget widget_tag_cloud underline-effect">
                  <h4 class="widget-title title white bordered">标签云</h4>
                  <div class="tagcloud">
                    
                      <a href="https://Yanoona.github.io/java/" class="ctag ctag-0 ctag-java" aria-label="">Java</a>
                    
                      <a href="https://Yanoona.github.io/7D-9V5P5T/" class="ctag ctag-1 ctag-7D-9V5P5T" aria-label="">Spring</a>
                    
                      <a href="https://Yanoona.github.io/wDtcCNomO/" class="ctag ctag-2 ctag-wDtcCNomO" aria-label="">Crontab定时任务</a>
                    
                      <a href="https://Yanoona.github.io/j_dWapwnj/" class="ctag ctag-3 ctag-j_dWapwnj" aria-label="">CentOS 7</a>
                    
                      <a href="https://Yanoona.github.io/dXBZlTYs0/" class="ctag ctag-4 ctag-dXBZlTYs0" aria-label="">Vue</a>
                    
                      <a href="https://Yanoona.github.io/bigData/" class="ctag ctag-5 ctag-bigData" aria-label="">大数据</a>
                    
                      <a href="https://Yanoona.github.io/Sqoop/" class="ctag ctag-6 ctag-Sqoop" aria-label="">Sqoop</a>
                    
                      <a href="https://Yanoona.github.io/Hive/" class="ctag ctag-7 ctag-Hive" aria-label="">Hive</a>
                    
                      <a href="https://Yanoona.github.io/mysql/" class="ctag ctag-8 ctag-mysql" aria-label="">mysql</a>
                    
                      <a href="https://Yanoona.github.io/Hadoop/" class="ctag ctag-9 ctag-Hadoop" aria-label="">Hadoop</a>
                    
                  </div>
                  <div class="clear"></div>
                </section>
              </div>

              <div class="grid-33 tablet-grid-50 mobile-grid-100">
                <section id="epcl_about-2" class="widget widget_epcl_about underline-effect">
                  <h4 class="widget-title title white bordered">关于我</h4>
                  <div class="avatar">
                    <a href="https://github.com/Yanoona" class="translate-effect thumb"><span class="fullimage cover" style="background-image: url(https://Yanoona.github.io/images/avatar.png);"></span></a>
                  </div>
                  <div class="info">
                    <h4 class="title small author-name gradient-effect no-margin"><a href="https://github.com/Yanoona">|ω･`)暗中观察</a></h4>
                    <p class="founder">大爷不进来看看吗？这里有好康的哦~~~</p>
                    <div class="social">
                      
                        
                            <a href="https://github.com/Yanoona" class="translate-effect" target="_blank"><i class="fa fa-github"></i></a>
                        
                      
                        
                      
                        
                            <a href="https://blog.csdn.net/qq_39299449" class="translate-effect" target="_blank"><i class="fa fa-csdn"></i></a>
                        
                      
                        
                            <a href="https://www.jianshu.com/u/6d8fc7359702" class="translate-effect" target="_blank"><i class="fa fa-jianshu"></i></a>
                        
                      
                    </div>
                  </div>
                  <div class="clear"></div>
                  </section>
              </div>

            </div>
            <div class="clear"></div>
        </div>

        <p class="published border-effect">
          ©2020 共 12 篇文章
        </p>
        
        <a href="javascript:void(0)" id="back-to-top" class="epcl-button dark" style="display:none">
          <i class="fa fa-arrow"></i>
        </a>
    </footer>
    <div class="clear"></div>

<script type="text/javascript">
    jQuery(document).ready(function ($) {
        $("photos img").each(function () {
            var _a = $("<a></a>").attr("href", this.src);
            $(this).wrap("<div class='photo'></div>").wrap(_a);
        })
        $("figure img").each(function () {
            var _b = $("<a></a>").attr("href", this.src);
            $(this).wrap(_b);
        })
        isImgLoad(function () {
            var photos = document.querySelector('photos');
            if (photos) {
                waterfall(photos);
            }
            $(window).resize(function () {
                if (photos) {
                    waterfall(photos);
                }
            });
        });
        var t_img;
        var isLoad = true;

        function isImgLoad(callback) {
            $('photos img').each(function () {
                if (this.height === 0) {
                    isLoad = false;
                    return false;
                }
            });
            if (isLoad) {
                clearTimeout(t_img);
                callback();
            } else {
                isLoad = true;
                t_img = setTimeout(function () {
                    isImgLoad(callback);
                }, 500);
            }
        }
    });
</script>

</div>
<!-- end: #wrapper -->
</body>
</html>
